#ifndef TM_ABSTRACT_HEADER
#define TM_ABSTRACT_HEADER
#include<string>
#include<fstream>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<iterator>
#include<vector>
#include<map>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include "def.hpp"
#include "utils.hpp"

namespace Puza{
  class GenericTopicModel{
  protected:
  public:
    DocList TM_DOCS;
    int LEARNING_MODE; // option: 0 -- batch mode
    // option: 1 -- online mode
    int READ_MODE; // indicate what kind of input format should be adapted.
    // option: 0 -- repeat the same token multiple times, save assignments .for gibbs sampling 
    // option: 1 -- save the same token once and save the counts. for vb
    int MAX_INT;
    GenericTopicModel();
    virtual void Inference()=0;
    virtual void Prediction()=0;
    virtual double Likelihood()=0;
    virtual int ReadDOCS()=0; // read documents from the disk
    virtual int GetDocuments(int)=0; // this indicate how documents are read through into the model
    virtual int SaveModel()=0;
    virtual int Interactive()=0;
    virtual ~GenericTopicModel(){};
  };
  
  GenericTopicModel::GenericTopicModel(){
    MAX_INT = 0;
    READ_MODE = 1; // default mode
  LEARNING_MODE = 0; // batch learning as the default learning mode
  }
};

#endif
